package com.taoge.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taoge.entity.Employee;
import com.taoge.entity.Msg;
import com.taoge.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/emp")
public class EmployeeController {

    @Autowired
    private EmployeeService service;

    //前端用Ajax请求后端直接返回json数据，便于多平台解析
    @GetMapping("/findAll")
    public Msg findAll(@RequestParam(value = "page", defaultValue = "1") Integer page) {
        //引入PageHelper插件，查询之前需要传入页码和每页几条数据
        PageHelper.startPage(page, 5);
        //startPage后面紧跟的查询就是分页查询
        List<Employee> list = service.findAll();
        //使用PageInfo包装查询后的结果，只需要将pageInfo交给页面就行了
        //pageInfo里面封装了详细的分页方法，包括我们查询的数据
        //第二个参数为连续显示的导航条个数
        PageInfo pageInfo = new PageInfo(list, 5);
        return Msg.success().add("pageInfo", pageInfo);
    }

    @PostMapping("/save")       //@RequestBody 不能加，415错误
    public Msg save(@Valid Employee employee, BindingResult bindingResult) {
        //定义一个map集合存放所有的错误信息
        Map<String, Object> map = new HashMap<>();
        if (bindingResult.hasErrors()) {
            //拿到所有的错误信息
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                System.out.println("错误字段：" + fieldError.getField());
                System.out.println("错误信息：" + fieldError.getDefaultMessage());
                map.put(fieldError.getField(), fieldError.getDefaultMessage());
            }
            return Msg.fail().add("errorsFields", map);
        } else {
            service.save(employee);
            return Msg.success();
        }
    }

    @GetMapping("/findByName")
    public Msg findByName(@RequestParam("empName") String empName) {
        //校验用户名规则是否合法
        String regx = "(^[a-zA-Z0-9_-]{6,12}$)|(^[\\u2E80-\\u9FFF]{2,5}$)";
        //注意，千万不要写反
        if (!empName.matches(regx)) {
            return Msg.fail().add("val_msg", "请输入2-5个中文或6-12为英文和数字组合！");
        }
        //数据查重校验
        boolean flag = service.findByName(empName);
        if (flag) {
            return Msg.success().add("val_msg", "用户名可用");
        } else {
            return Msg.fail().add("val_msg", "用户名已存在！");
        }
    }

    @GetMapping("/findById/{empId}")
    public Msg findById(@PathVariable("empId") Integer empId) {
        return Msg.success().add("emp", service.findById(empId));
    }

    /*
        问题：
            如果直接用Ajax发送put请求，处理路径上带的参数，其他的全部为null，也就是data数据传不过来，无法封装对象
            原因：Tomcat
                1.将请求体中的参数封装为map
                2.request.getParameter("empName")就会从map中取值
                3.SpringMvc封装pojo对象时，会把每个poji每个属性的值通过request.getParameter("empName")拿到，
                  但是没有被Tomcat封装为map集合，拿不到值
            Ajax发送put请求引发的血案：
                PUT请求：请求体中的数据拿不到
                Tomcat识别是PUT请求不会封装请求体中的数据为map，只有post形式的请求才会封装请求体中的数据为map

         解决方法：在web.xml里配置HttpPutFormContentFilter过滤器
            它的作用是将请求体的数据解析封装为一个map，request被重新封装，request.getParameter()被重写，
            就会从自己封装的map中取数据
    */
    @PutMapping("/update/{empId}")
    public Msg update(@Valid Employee employee,BindingResult bindingResult) {
        //定义一个map集合存放所有的错误信息
        Map<String, Object> map = new HashMap<>();
        if (bindingResult.hasErrors()) {
            //拿到所有的错误信息
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                System.out.println("错误字段：" + fieldError.getField());
                System.out.println("错误信息：" + fieldError.getDefaultMessage());
                map.put(fieldError.getField(), fieldError.getDefaultMessage());
            }
            return Msg.fail().add("errorsFields", map);
        } else {
            service.update(employee);
            return Msg.success();
        }
    }

    //修改成可以接受批量删除
    @DeleteMapping("/delete/{empIds}")
    public Msg deleteById(@PathVariable("empIds") String empIds){
        if (empIds.contains("-")){
            String[] str = empIds.split("-");
            List<Integer> ids = new ArrayList<>();
            for (String s : str) {
                ids.add(Integer.parseInt(s));
            }
            service.deleteBatch(ids);
        }else {
            service.deleteById(Integer.parseInt(empIds));
        }
        return Msg.success();
    }

    /*@GetMapping("/findAll")
    public String findAll(@RequestParam(value = "page",defaultValue = "1")Integer page
    , Model model){
        //引入PageHelper插件，查询之前需要传入页码和每页几条数据
        PageHelper.startPage(page,5);
        //startPage后面紧跟的查询就是分页查询
        List<Employee> list = service.findAll();
        //使用PageInfo包装查询后的结果，只需要将pageInfo交给页面就行了
        //pageInfo里面封装了详细的分页方法，包括我们查询的数据
        //第二个参数为连续显示的页数
        PageInfo pageInfo = new PageInfo(list,5);
        model.addAttribute("pageInfo",pageInfo);
        return "list";
    }*/

}
